home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / motasms.zoo / util.c < prev   
C/C++ Source or Header  |  1990-12-16  |  4KB  |  273 lines

  1. /*
  2.  *      fatal --- fatal error handler
  3.  */
  4. fatal(str)
  5. char    *str;
  6. {
  7.     printf("%s\n",str);
  8.     exit(-1);
  9. }
  10.  
  11. /*
  12.  *      error --- error in a line
  13.  *                      print line number and error
  14.  */
  15. error(str)
  16. char    *str;
  17. {
  18.     if(N_files > 1)
  19.         printf("%s,",Argv[Cfn]);
  20.     printf("%d: ",Line_num);
  21.     printf("%s\n",str);
  22.     Err_count++;
  23. }
  24. /*
  25.  *      warn --- trivial error in a line
  26.  *                      print line number and error
  27.  */
  28. warn(str)
  29. char    *str;
  30. {
  31.     if(N_files > 1)
  32.         printf("%s,",Argv[Cfn]);
  33.     printf("%d: ",Line_num);
  34.     printf("Warning --- %s\n",str);
  35. }
  36.  
  37.  
  38. /*
  39.  *      delim --- check if character is a delimiter
  40.  */
  41. delim(c)
  42. char    c;
  43. {
  44.     if( any(c," \t\n"))
  45.         return(YES);
  46.     return(NO);
  47. }
  48.  
  49. /*
  50.  *      skip_white --- move pointer to next non-whitespace char
  51.  */
  52. char *skip_white(ptr)
  53. char    *ptr;
  54. {
  55.     while(*ptr==BLANK || *ptr==TAB)
  56.         ptr++;
  57.     return(ptr);
  58. }
  59.  
  60. /*
  61.  *      eword --- emit a word to code file
  62.  */
  63. eword(wd)
  64. int     wd;
  65. {
  66.     emit(hibyte(wd));
  67.     emit(lobyte(wd));
  68. }
  69.  
  70. /*
  71.  *      emit --- emit a byte to code file
  72.  */
  73. emit(byte)
  74. {
  75. #ifdef DEBUG
  76.     printf("%2x @ %4x\n",byte,Pc);
  77. #endif
  78.     if(Pass==1){
  79.         Pc++;
  80.         return(YES);
  81.         }
  82.     if(P_total < P_LIMIT)
  83.         P_bytes[P_total++] = byte;
  84.     E_bytes[E_total++] = byte;
  85.     Pc++;
  86.     if(E_total == E_LIMIT)
  87.         f_record();
  88. }
  89.  
  90. /*
  91.  *      f_record --- flush record out in `S1' format
  92.  */
  93. f_record()
  94. {
  95.     int     i;
  96.     int     chksum;
  97.  
  98.     if(Pass == 1)
  99.         return;
  100.     if(E_total==0){
  101.         E_pc = Pc;
  102.         return;
  103.         }
  104.     chksum =  E_total+3;    /* total bytes in this record */
  105.     chksum += lobyte(E_pc);
  106.     chksum += E_pc>>8;
  107.     fprintf(Objfil,"S1");   /* record header preamble */
  108.     hexout(E_total+3);      /* byte count +3 */
  109.     hexout(E_pc>>8);        /* high byte of PC */
  110.     hexout(lobyte(E_pc));    /* low byte of PC */
  111.     for(i=0;i<E_total;i++){
  112.         chksum += lobyte(E_bytes[i]);
  113.         hexout(lobyte(E_bytes[i]));    /* data byte */
  114.         }
  115.     chksum =~ chksum;       /* one's complement */
  116.     hexout(lobyte(chksum));    /* checksum */
  117.     fprintf(Objfil,"\n");
  118.     E_pc = Pc;
  119.     E_total = 0;
  120. }
  121.  
  122. char    *hexstr = { "0123456789ABCDEF" } ;
  123.  
  124. hexout(byte)
  125. int     byte;
  126. {
  127.     char hi,lo;
  128.  
  129.     byte = lobyte(byte);
  130.     fprintf(Objfil,"%c%c",hexstr[byte>>4],hexstr[byte&017]);
  131. }
  132.  
  133. /*
  134.  *      print_line --- pretty print input line
  135.  */
  136. print_line()
  137. {
  138.     int     i;
  139.     register char *ptr;
  140.  
  141.         printf ("%04d ",Line_num);
  142.     if(P_total || P_force)
  143.         printf("%04x",Old_pc);
  144.     else
  145.         printf("    ");
  146.  
  147.     for(i=0;i<P_total && i<6;i++)
  148.         printf(" %02x",lobyte(P_bytes[i]));
  149.     for(;i<6;i++)
  150.         printf("   ");
  151.     printf("  ");
  152.  
  153.     if(Cflag){
  154.         if(Cycles)
  155.             printf("[%2d ] ",Cycles);
  156.         else
  157.             printf("      ");
  158.         }
  159.     ptr = Line;
  160.     while( *ptr != '\n' )   /* just echo the line back out */
  161.         putchar(*ptr++);
  162.     for(;i<P_total;i++){
  163.         if( i%6 == 0 )
  164.             printf("\n    ");
  165.         printf(" %02x",lobyte(P_bytes[i]));
  166.         }
  167.     printf("\n");
  168. }
  169.  
  170. /*
  171.  *      any --- does str contain c?
  172.  */
  173. any(c,str)
  174. char    c;
  175. char    *str;
  176. {
  177.     while(*str != EOS)
  178.         if(*str++ == c)
  179.             return(YES);
  180.     return(NO);
  181. }
  182.  
  183. /*
  184.  *      mapdn --- convert A-Z to a-z
  185.  */
  186. char mapdn(c)
  187. char c;
  188. {
  189.     if( c >= 'A' && c <= 'Z')
  190.         return(c+040);
  191.     return(c);
  192. }
  193.  
  194. /*
  195.  *      lobyte --- return low byte of an int
  196.  */
  197. lobyte(i)
  198. int i;
  199. {
  200.     return(i&0xFF);
  201. }
  202. /*
  203.  *      hibyte --- return high byte of an int
  204.  */
  205. hibyte(i)
  206. int i;
  207. {
  208.     return((i>>8)&0xFF);
  209. }
  210.  
  211. /*
  212.  *      head --- is str2 the head of str1?
  213.  */
  214. head(str1,str2)
  215. char *str1,*str2;
  216. {
  217.     while( *str1 != EOS && *str2 != EOS){
  218.         if( *str1 != *str2 )break;
  219.         str1++;
  220.         str2++;
  221.         }
  222.     if(*str1 == *str2)return(YES);
  223.     if(*str2==EOS)
  224.         if( any(*str1," \t\n,+-];*") )return(YES);
  225.     return(NO);
  226. }
  227.  
  228. /*
  229.  *      alpha --- is character a legal letter
  230.  */
  231. alpha(c)
  232. char c;
  233. {
  234.     if( c<= 'z' && c>= 'a' )return(YES);
  235.     if( c<= 'Z' && c>= 'A' )return(YES);
  236.     if( c== '_' )return(YES);
  237.     if( c== '.' )return(YES);
  238.     return(NO);
  239. }
  240. /*
  241.  *      alphan --- is character a legal letter or digit
  242.  */
  243. alphan(c)
  244. char c;
  245. {
  246.     if( alpha(c) )return(YES);
  247.     if( c<= '9' && c>= '0' )return(YES);
  248.     if( c == '$' )return(YES);      /* allow imbedded $ */
  249.     return(NO);
  250. }
  251.  
  252. /*
  253.  *    white --- is character whitespace?
  254.  */
  255. white(c)
  256. char c;
  257. {
  258.     if( c == TAB || c == BLANK || c == '\n' )return(YES);
  259.     return(NO);
  260. }
  261.  
  262. /*
  263.  *    alloc --- allocate memory
  264.  */
  265. char *
  266. alloc(nbytes)
  267. int nbytes;
  268. {
  269.     char *malloc();
  270.  
  271.     return(malloc(nbytes));
  272. }
  273.